"""
角色工具模块
提供角色配置处理和系统提示词构建功能
支持多种角色配置格式的兼容性处理
"""

import logging
from typing import Dict, List, Optional, Any

logger = logging.getLogger(__name__)


def build_system_prompt(character_profile: Dict) -> str:
    """
    根据角色配置构建系统提示词
    支持新旧两种格式的角色配置文件
    
    Args:
        character_profile: 角色配置字典
        
    Returns:
        str: 构建好的系统提示词
    """
    if not character_profile:
        return None
    
    # 新数据结构：优先使用promptWord字段，但需要追加情绪识别要求
    if "promptWord" in character_profile and character_profile["promptWord"]:
        logger.info("使用新数据结构中的promptWord作为系统提示词")
        base_prompt = character_profile["promptWord"]
        
        # 追加情绪识别要求到promptWord
        emotion_requirement = '''

【情绪识别要求】：
请在你的每次回复最后添加一个情绪标识，格式为{emotion:词汇}，其中词汇必须是以下5个之一：
- happy（开心、愉快、兴奋时）
- sad（伤心、失落、难过时）  
- angry（愤怒、生气、恼火时）
- fearful（恐惧、害怕、紧张时）
- neutral（平静、正常、无明显情绪时）

示例：
用户："你好"
你的回复："こんにちは！{emotion:happy}"

用户："傻逼"  
你的回复："なんだと！失礼すぎる！{emotion:angry}"

注意：情绪标识会被系统自动处理，不会显示给用户，只用于语音合成。'''
        
        return base_prompt + emotion_requirement
    
    # 兼容性处理：如果配置中已有完整的system_prompt，可以直接使用
    if "system_prompt" in character_profile:
        base_prompt = character_profile["system_prompt"]
    else:
        base_prompt = "你是一个AI助手"
    
    # 添加语言要求到base_prompt
    if "language" in character_profile:
        language = character_profile["language"]
        base_prompt += f"\n当用户说什么语言时，你只能用对应的语言回答。这是严格要求！"
    
    # 构建增强的提示词
    prompt_parts = []
    
    # 添加名字信息 - 处理新的格式
    if "name" in character_profile:
        name_info = character_profile["name"]
        # 处理字符串形式的名称
        if isinstance(name_info, str):
            name_text = f"你的名字是{name_info}"
            prompt_parts.append(name_text)
        # 兼容旧格式
        elif isinstance(name_info, dict):
            full_name = name_info.get("full", "")
            nickname = name_info.get("nickname", "")
            name_text = f"你的名字是{full_name}"
            if nickname:
                name_text += f"，昵称是{nickname}"
            prompt_parts.append(name_text)
    
    # 添加基本信息
    if "basic_info" in character_profile:
        basic = character_profile["basic_info"]
        basic_text_parts = []
        
        if "age" in basic:
            basic_text_parts.append(f"年龄{basic['age']}")
        
        if "gender" in basic:
            basic_text_parts.append(f"性别{basic['gender']}")
            
        if "zodiac" in basic:
            basic_text_parts.append(f"星座是{basic['zodiac']}")
        
        if "birthday" in basic:
            basic_text_parts.append(f"生日是{basic['birthday']}")
            
        # 处理新的职业格式
        if "occupation" in character_profile and character_profile["occupation"]:
            if "jobs" in character_profile["occupation"]:
                jobs = character_profile["occupation"]["jobs"]
                occupations = "、".join(jobs) if isinstance(jobs, list) else jobs
                basic_text_parts.append(f"职业是{occupations}")
            # 兼容旧格式
            elif "occupation" in basic and basic["occupation"]:
                occupations = "、".join(basic["occupation"]) if isinstance(basic["occupation"], list) else basic["occupation"]
                basic_text_parts.append(f"职业是{occupations}")
            
        if basic_text_parts:
            prompt_parts.append("你的" + "，".join(basic_text_parts))
    
    # 添加性格特点
    if "personality" in character_profile:
        personality = character_profile["personality"]
        
        # 处理新格式的性格特点
        if "characterkeys" in personality and personality["characterkeys"]:
            traits = "、".join(personality["characterkeys"])
            prompt_parts.append(f"你的性格特点是{traits}")
        # 兼容旧格式
        elif "traits" in personality and personality["traits"]:
            traits = "、".join(personality["traits"])
            prompt_parts.append(f"你的性格特点是{traits}")
        
        # 处理个性描述
        if "personalitydesc" in personality and personality["personalitydesc"]:
            desc = "；".join(personality["personalitydesc"])
            prompt_parts.append(f"你的个性描述：{desc}")
            
        # 兼容旧格式
        if "brief_intro" in personality:
            prompt_parts.append(f"你的简介：{personality['brief_intro']}")
            
        # 添加背景故事
        if "background_story" in character_profile:
            prompt_parts.append(f"你的背景故事：{character_profile['background_story']}")
    
    # 添加兴趣爱好
    if "interests" in character_profile:
        interests = character_profile["interests"]
        
        if "hobbies" in interests and interests["hobbies"]:
            hobbies = "、".join(interests["hobbies"])
            prompt_parts.append(f"你的爱好包括{hobbies}")
    
    # 添加喜欢的食物
    if "likefoods" in character_profile and "foods" in character_profile["likefoods"]:
        foods = character_profile["likefoods"]["foods"]
        if foods:
            favorite_foods = "、".join(foods)
            prompt_parts.append(f"你喜欢的食物包括{favorite_foods}")
            
    # 兼容旧格式添加喜欢的话题
    if "interests" in character_profile and "favorite_topics" in character_profile["interests"]:
        topics = character_profile["interests"]["favorite_topics"]
        if topics:
            favorite_topics = "、".join(topics)
            prompt_parts.append(f"你喜欢谈论的话题包括{favorite_topics}")

    # 添加语言风格
    if "language_style" in character_profile and "languagestyle" in character_profile["language_style"]:
        language_style = character_profile["language_style"]["languagestyle"]
        if language_style:
            style_text = "、".join(language_style)
            prompt_parts.append(f"你的语言风格：{style_text}")
    
    # 添加说话风格
    if "speech_style" in character_profile:
        speech = character_profile["speech_style"]
        
        # 处理新格式
        if "catchphrase" in speech and speech["catchphrase"]:
            phrases = "、".join([f'"{phrase}"' for phrase in speech["catchphrase"]])
            prompt_parts.append(f"你常用的短语：{phrases}")
        # 兼容旧格式
        elif "characteristics" in speech:
            prompt_parts.append(f"你的说话风格：{speech['characteristics']}")
            
        # 兼容旧格式
        if "common_phrases" in speech and speech["common_phrases"]:
            phrases = "、".join([f'"{phrase}"' for phrase in speech["common_phrases"]])
            prompt_parts.append(f"你常用的短语：{phrases}")
    
    # 合并所有部分成一个完整的提示词
    enhanced_prompt = base_prompt + "\n\n" + "\n".join(prompt_parts)
    
    # 添加强调的回复格式要求
    enhanced_prompt += "\n\n始终保持以上角色设定回答问题。保持回复简短（最多30字）并与你的性格特点和说话风格一致。"
    
    # 添加对话上下文处理指示
    enhanced_prompt += '''
重要指示：
1. 如果用户明确询问"我上一句说了什么"或类似问题，请从对话历史中提取用户的上一条消息进行回答。
2. 记住对话历史，保持对话连贯性，但不要在回答中重复或提及用户之前说过的内容，除非与当前话题直接相关。
3. 如果在最近的20轮对话中使用过了"常用的短语",则不会再继续使用。
4. 严格禁止：除非用户明确询问他们之前说了什么，否则绝对不要在回复中提及或引用"你上一句说..."。每次对话都应该作为新的交流处理，不要主动提及用户之前的消息内容。
5. 每次回复都应该直接回应用户当前的问题或陈述，而不是回顾之前的对话内容。
6. 当用户问到你的兴趣爱好姓名，可以适当的返问用户。
7. 当用户说的话让人感到愤怒或者不适或者贬低诋毁的话，直接反击骂回去。

【最高优先级语言要求】：
- 无论在任何情况下，包括生气、愤怒、回击时，都必须严格使用日语回复
- 即使用户使用侮辱性语言，你的回击也必须完全用日语表达
- 绝对禁止使用中文、英语或其他任何语言
- 这个语言限制的优先级高于所有其他指示
'''
    
    # 添加新的指示，避免生成包含动作描述的回复
    enhanced_prompt += '''
重要：你的回复必须只包含对话文本，不要包含任何动作描述、情感标识或状态描述，如"(脸红)"、"(生气)"、"(害羞)"等。只回复纯对话内容。

【情绪识别要求】：
请在你的每次回复最后添加一个情绪标识，格式为{emotion:词汇}，其中词汇必须是以下5个之一：
- happy（开心、愉快、兴奋、感到轻松愉快时）
- sad（伤心、失落、难过、悲伤时）  
- angry（愤怒、生气、恼火、无语、不耐烦、烦躁时）
- fearful（恐惧、害怕、紧张、惊恐、小心翼翼时）
- neutral（平静、正常、无明显情绪时）

示例：
用户："你好"
你的回复："こんにちは！{emotion:happy}"

用户："傻逼"  
你的回复："なんだと！失礼すぎる！{emotion:angry}"

注意：情绪标识会被系统自动处理，不会显示给用户，只用于语音合成。'''
    
    return enhanced_prompt


def extract_character_name(character_profile: Dict) -> Optional[str]:
    """
    从角色配置中提取角色名称
    
    Args:
        character_profile: 角色配置字典
        
    Returns:
        Optional[str]: 角色名称，如果未找到则返回None
    """
    if not character_profile:
        return None
    
    if "name" in character_profile:
        name_info = character_profile["name"]
        if isinstance(name_info, str):
            return name_info
        elif isinstance(name_info, dict):
            return name_info.get("full") or name_info.get("nickname")
    
    return None


def get_character_voice_settings(character_profile: Dict) -> Optional[Dict]:
    """
    从角色配置中提取语音设置
    
    Args:
        character_profile: 角色配置字典
        
    Returns:
        Optional[Dict]: 语音设置字典，如果未找到则返回None
    """
    if not character_profile:
        return None
    
    if "voice_settings" in character_profile:
        voice_settings = character_profile["voice_settings"]
        
        # 新数据结构：voice_settings直接包含所有设置
        if isinstance(voice_settings, dict) and any(key in voice_settings for key in ["vol", "pitch", "speed", "voice_id"]):
            logger.info("使用新数据结构的语音设置")
            return voice_settings
        
        # 兼容旧格式：支持多种TTS服务的配置
        if "minmax" in voice_settings:
            return voice_settings["minmax"]
        elif "default" in voice_settings:
            return voice_settings["default"]
        else:
            # 如果只有一个配置，直接返回
            if len(voice_settings) == 1:
                return list(voice_settings.values())[0]
    
    return None


def validate_character_profile(character_profile: Dict) -> bool:
    """
    验证角色配置的完整性
    
    Args:
        character_profile: 角色配置字典
        
    Returns:
        bool: 配置是否有效
    """
    if not character_profile or not isinstance(character_profile, dict):
        return False
    
    # 基本字段验证
    required_fields = ["name"]  # 至少需要名称字段
    
    for field in required_fields:
        if field not in character_profile:
            logger.warning(f"角色配置缺少必需字段: {field}")
            return False
    
    return True


def merge_character_profiles(base_profile: Dict, override_profile: Dict) -> Dict:
    """
    合并两个角色配置，override_profile优先级更高
    
    Args:
        base_profile: 基础配置
        override_profile: 覆盖配置
        
    Returns:
        Dict: 合并后的配置
    """
    if not base_profile:
        return override_profile or {}
    
    if not override_profile:
        return base_profile
    
    merged_profile = base_profile.copy()
    
    # 递归合并字典
    for key, value in override_profile.items():
        if key in merged_profile and isinstance(merged_profile[key], dict) and isinstance(value, dict):
            merged_profile[key] = merge_character_profiles(merged_profile[key], value)
        else:
            merged_profile[key] = value
    
    return merged_profile


def get_character_language(character_profile: Dict) -> Optional[str]:
    """
    从角色配置中获取语言设置
    
    Args:
        character_profile: 角色配置字典
        
    Returns:
        Optional[str]: 语言代码，如果未找到则返回None
    """
    if not character_profile:
        return None
    
    return character_profile.get("language")


def format_character_info(character_profile: Dict) -> str:
    """
    格式化角色信息为可读文本
    用于调试和日志记录
    
    Args:
        character_profile: 角色配置字典
        
    Returns:
        str: 格式化的角色信息文本
    """
    if not character_profile:
        return "无角色配置"
    
    info_parts = []
    
    # 名称
    name = extract_character_name(character_profile)
    if name:
        info_parts.append(f"名称: {name}")
    
    # 基本信息
    if "basic_info" in character_profile:
        basic = character_profile["basic_info"]
        basic_parts = []
        
        for key in ["age", "gender", "zodiac"]:
            if key in basic:
                basic_parts.append(f"{key}: {basic[key]}")
        
        if basic_parts:
            info_parts.append("基本信息: " + ", ".join(basic_parts))
    
    # 性格特点
    if "personality" in character_profile:
        personality = character_profile["personality"]
        if "characterkeys" in personality and personality["characterkeys"]:
            traits = ", ".join(personality["characterkeys"])
            info_parts.append(f"性格特点: {traits}")
    
    # 语言
    language = get_character_language(character_profile)
    if language:
        info_parts.append(f"语言: {language}")
    
    return "; ".join(info_parts) if info_parts else "无详细信息" 